/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import Clases.*;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import Controladores.exceptions.IllegalOrphanException;
import Controladores.exceptions.NonexistentEntityException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author PaBLo
 */
public class CatedraticocursoJpaController implements Serializable {

    public CatedraticocursoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Catedraticocurso catedraticocurso) {
        if (catedraticocurso.getCursounidadCollection() == null) {
            catedraticocurso.setCursounidadCollection(new ArrayList<Cursounidad>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Ciclocurso idCicloCurso = catedraticocurso.getIdCicloCurso();
            if (idCicloCurso != null) {
                idCicloCurso = em.getReference(idCicloCurso.getClass(), idCicloCurso.getIdCicloCurso());
                catedraticocurso.setIdCicloCurso(idCicloCurso);
            }
            Curso idCurso = catedraticocurso.getIdCurso();
            if (idCurso != null) {
                idCurso = em.getReference(idCurso.getClass(), idCurso.getIdCurso());
                catedraticocurso.setIdCurso(idCurso);
            }
            Catedratico idCatedratico = catedraticocurso.getIdCatedratico();
            if (idCatedratico != null) {
                idCatedratico = em.getReference(idCatedratico.getClass(), idCatedratico.getIdCatedratico());
                catedraticocurso.setIdCatedratico(idCatedratico);
            }
            Gradoseccionciclo idGradoSeccionCiclo = catedraticocurso.getIdGradoSeccionCiclo();
            if (idGradoSeccionCiclo != null) {
                idGradoSeccionCiclo = em.getReference(idGradoSeccionCiclo.getClass(), idGradoSeccionCiclo.getIdGradoSeccionCiclo());
                catedraticocurso.setIdGradoSeccionCiclo(idGradoSeccionCiclo);
            }
            Collection<Cursounidad> attachedCursounidadCollection = new ArrayList<Cursounidad>();
            for (Cursounidad cursounidadCollectionCursounidadToAttach : catedraticocurso.getCursounidadCollection()) {
                cursounidadCollectionCursounidadToAttach = em.getReference(cursounidadCollectionCursounidadToAttach.getClass(), cursounidadCollectionCursounidadToAttach.getIdCursoUnidad());
                attachedCursounidadCollection.add(cursounidadCollectionCursounidadToAttach);
            }
            catedraticocurso.setCursounidadCollection(attachedCursounidadCollection);
            em.persist(catedraticocurso);
            if (idCicloCurso != null) {
                idCicloCurso.getCatedraticocursoCollection().add(catedraticocurso);
                idCicloCurso = em.merge(idCicloCurso);
            }
            if (idCurso != null) {
                idCurso.getCatedraticocursoCollection().add(catedraticocurso);
                idCurso = em.merge(idCurso);
            }
            if (idCatedratico != null) {
                idCatedratico.getCatedraticocursoCollection().add(catedraticocurso);
                idCatedratico = em.merge(idCatedratico);
            }
            if (idGradoSeccionCiclo != null) {
                idGradoSeccionCiclo.getCatedraticocursoCollection().add(catedraticocurso);
                idGradoSeccionCiclo = em.merge(idGradoSeccionCiclo);
            }
            for (Cursounidad cursounidadCollectionCursounidad : catedraticocurso.getCursounidadCollection()) {
                Catedraticocurso oldIdCatedraticoCursoOfCursounidadCollectionCursounidad = cursounidadCollectionCursounidad.getIdCatedraticoCurso();
                cursounidadCollectionCursounidad.setIdCatedraticoCurso(catedraticocurso);
                cursounidadCollectionCursounidad = em.merge(cursounidadCollectionCursounidad);
                if (oldIdCatedraticoCursoOfCursounidadCollectionCursounidad != null) {
                    oldIdCatedraticoCursoOfCursounidadCollectionCursounidad.getCursounidadCollection().remove(cursounidadCollectionCursounidad);
                    oldIdCatedraticoCursoOfCursounidadCollectionCursounidad = em.merge(oldIdCatedraticoCursoOfCursounidadCollectionCursounidad);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Catedraticocurso catedraticocurso) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Catedraticocurso persistentCatedraticocurso = em.find(Catedraticocurso.class, catedraticocurso.getIdCatedraticoCurso());
            Ciclocurso idCicloCursoOld = persistentCatedraticocurso.getIdCicloCurso();
            Ciclocurso idCicloCursoNew = catedraticocurso.getIdCicloCurso();
            Curso idCursoOld = persistentCatedraticocurso.getIdCurso();
            Curso idCursoNew = catedraticocurso.getIdCurso();
            Catedratico idCatedraticoOld = persistentCatedraticocurso.getIdCatedratico();
            Catedratico idCatedraticoNew = catedraticocurso.getIdCatedratico();
            Gradoseccionciclo idGradoSeccionCicloOld = persistentCatedraticocurso.getIdGradoSeccionCiclo();
            Gradoseccionciclo idGradoSeccionCicloNew = catedraticocurso.getIdGradoSeccionCiclo();
            Collection<Cursounidad> cursounidadCollectionOld = persistentCatedraticocurso.getCursounidadCollection();
            Collection<Cursounidad> cursounidadCollectionNew = catedraticocurso.getCursounidadCollection();
            List<String> illegalOrphanMessages = null;
            for (Cursounidad cursounidadCollectionOldCursounidad : cursounidadCollectionOld) {
                if (!cursounidadCollectionNew.contains(cursounidadCollectionOldCursounidad)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Cursounidad " + cursounidadCollectionOldCursounidad + " since its idCatedraticoCurso field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (idCicloCursoNew != null) {
                idCicloCursoNew = em.getReference(idCicloCursoNew.getClass(), idCicloCursoNew.getIdCicloCurso());
                catedraticocurso.setIdCicloCurso(idCicloCursoNew);
            }
            if (idCursoNew != null) {
                idCursoNew = em.getReference(idCursoNew.getClass(), idCursoNew.getIdCurso());
                catedraticocurso.setIdCurso(idCursoNew);
            }
            if (idCatedraticoNew != null) {
                idCatedraticoNew = em.getReference(idCatedraticoNew.getClass(), idCatedraticoNew.getIdCatedratico());
                catedraticocurso.setIdCatedratico(idCatedraticoNew);
            }
            if (idGradoSeccionCicloNew != null) {
                idGradoSeccionCicloNew = em.getReference(idGradoSeccionCicloNew.getClass(), idGradoSeccionCicloNew.getIdGradoSeccionCiclo());
                catedraticocurso.setIdGradoSeccionCiclo(idGradoSeccionCicloNew);
            }
            Collection<Cursounidad> attachedCursounidadCollectionNew = new ArrayList<Cursounidad>();
            for (Cursounidad cursounidadCollectionNewCursounidadToAttach : cursounidadCollectionNew) {
                cursounidadCollectionNewCursounidadToAttach = em.getReference(cursounidadCollectionNewCursounidadToAttach.getClass(), cursounidadCollectionNewCursounidadToAttach.getIdCursoUnidad());
                attachedCursounidadCollectionNew.add(cursounidadCollectionNewCursounidadToAttach);
            }
            cursounidadCollectionNew = attachedCursounidadCollectionNew;
            catedraticocurso.setCursounidadCollection(cursounidadCollectionNew);
            catedraticocurso = em.merge(catedraticocurso);
            if (idCicloCursoOld != null && !idCicloCursoOld.equals(idCicloCursoNew)) {
                idCicloCursoOld.getCatedraticocursoCollection().remove(catedraticocurso);
                idCicloCursoOld = em.merge(idCicloCursoOld);
            }
            if (idCicloCursoNew != null && !idCicloCursoNew.equals(idCicloCursoOld)) {
                idCicloCursoNew.getCatedraticocursoCollection().add(catedraticocurso);
                idCicloCursoNew = em.merge(idCicloCursoNew);
            }
            if (idCursoOld != null && !idCursoOld.equals(idCursoNew)) {
                idCursoOld.getCatedraticocursoCollection().remove(catedraticocurso);
                idCursoOld = em.merge(idCursoOld);
            }
            if (idCursoNew != null && !idCursoNew.equals(idCursoOld)) {
                idCursoNew.getCatedraticocursoCollection().add(catedraticocurso);
                idCursoNew = em.merge(idCursoNew);
            }
            if (idCatedraticoOld != null && !idCatedraticoOld.equals(idCatedraticoNew)) {
                idCatedraticoOld.getCatedraticocursoCollection().remove(catedraticocurso);
                idCatedraticoOld = em.merge(idCatedraticoOld);
            }
            if (idCatedraticoNew != null && !idCatedraticoNew.equals(idCatedraticoOld)) {
                idCatedraticoNew.getCatedraticocursoCollection().add(catedraticocurso);
                idCatedraticoNew = em.merge(idCatedraticoNew);
            }
            if (idGradoSeccionCicloOld != null && !idGradoSeccionCicloOld.equals(idGradoSeccionCicloNew)) {
                idGradoSeccionCicloOld.getCatedraticocursoCollection().remove(catedraticocurso);
                idGradoSeccionCicloOld = em.merge(idGradoSeccionCicloOld);
            }
            if (idGradoSeccionCicloNew != null && !idGradoSeccionCicloNew.equals(idGradoSeccionCicloOld)) {
                idGradoSeccionCicloNew.getCatedraticocursoCollection().add(catedraticocurso);
                idGradoSeccionCicloNew = em.merge(idGradoSeccionCicloNew);
            }
            for (Cursounidad cursounidadCollectionNewCursounidad : cursounidadCollectionNew) {
                if (!cursounidadCollectionOld.contains(cursounidadCollectionNewCursounidad)) {
                    Catedraticocurso oldIdCatedraticoCursoOfCursounidadCollectionNewCursounidad = cursounidadCollectionNewCursounidad.getIdCatedraticoCurso();
                    cursounidadCollectionNewCursounidad.setIdCatedraticoCurso(catedraticocurso);
                    cursounidadCollectionNewCursounidad = em.merge(cursounidadCollectionNewCursounidad);
                    if (oldIdCatedraticoCursoOfCursounidadCollectionNewCursounidad != null && !oldIdCatedraticoCursoOfCursounidadCollectionNewCursounidad.equals(catedraticocurso)) {
                        oldIdCatedraticoCursoOfCursounidadCollectionNewCursounidad.getCursounidadCollection().remove(cursounidadCollectionNewCursounidad);
                        oldIdCatedraticoCursoOfCursounidadCollectionNewCursounidad = em.merge(oldIdCatedraticoCursoOfCursounidadCollectionNewCursounidad);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Short id = catedraticocurso.getIdCatedraticoCurso();
                if (findCatedraticocurso(id) == null) {
                    throw new NonexistentEntityException("The catedraticocurso with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Short id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Catedraticocurso catedraticocurso;
            try {
                catedraticocurso = em.getReference(Catedraticocurso.class, id);
                catedraticocurso.getIdCatedraticoCurso();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The catedraticocurso with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Cursounidad> cursounidadCollectionOrphanCheck = catedraticocurso.getCursounidadCollection();
            for (Cursounidad cursounidadCollectionOrphanCheckCursounidad : cursounidadCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Catedraticocurso (" + catedraticocurso + ") cannot be destroyed since the Cursounidad " + cursounidadCollectionOrphanCheckCursounidad + " in its cursounidadCollection field has a non-nullable idCatedraticoCurso field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Ciclocurso idCicloCurso = catedraticocurso.getIdCicloCurso();
            if (idCicloCurso != null) {
                idCicloCurso.getCatedraticocursoCollection().remove(catedraticocurso);
                idCicloCurso = em.merge(idCicloCurso);
            }
            Curso idCurso = catedraticocurso.getIdCurso();
            if (idCurso != null) {
                idCurso.getCatedraticocursoCollection().remove(catedraticocurso);
                idCurso = em.merge(idCurso);
            }
            Catedratico idCatedratico = catedraticocurso.getIdCatedratico();
            if (idCatedratico != null) {
                idCatedratico.getCatedraticocursoCollection().remove(catedraticocurso);
                idCatedratico = em.merge(idCatedratico);
            }
            Gradoseccionciclo idGradoSeccionCiclo = catedraticocurso.getIdGradoSeccionCiclo();
            if (idGradoSeccionCiclo != null) {
                idGradoSeccionCiclo.getCatedraticocursoCollection().remove(catedraticocurso);
                idGradoSeccionCiclo = em.merge(idGradoSeccionCiclo);
            }
            em.remove(catedraticocurso);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Catedraticocurso> findCatedraticocursoEntities() {
        return findCatedraticocursoEntities(true, -1, -1);
    }

    public List<Catedraticocurso> findCatedraticocursoEntities(int maxResults, int firstResult) {
        return findCatedraticocursoEntities(false, maxResults, firstResult);
    }

    private List<Catedraticocurso> findCatedraticocursoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Catedraticocurso.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Catedraticocurso findCatedraticocurso(Short id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Catedraticocurso.class, id);
        } finally {
            em.close();
        }
    }

    public int getCatedraticocursoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Catedraticocurso> rt = cq.from(Catedraticocurso.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
